const express = require("express");
const router = express.Router();
const { verifyToken } = require("../middlewares/auth");

// 起名接口
// 处理用户的起名请求，验证用户权限，记录查询历史，并返回AI生成的名字
router.post("/generate", verifyToken, async (req, res) => {
  try {
    // 检查剩余查询次数
    // 如果用户的剩余查询次数不足，返回403错误
    if (req.userInfo.remaining_queries <= 0) {
      return res.status(403).json({ error: "剩余查询次数不足" });
    }

    // 解构请求参数
    const {
      surname, // 姓氏
      gender, // 性别
      generation_word, // 字辈要求
      five_elements, // 五行属性
      meaning_tags, // 期望寓意标签
      poetry_source, // 是否需要诗词出处
    } = req.body;

    // 验证必填参数
    // 姓氏和性别为必填项，如果缺少则返回400错误
    if (!surname || !gender) {
      return res.status(400).json({ error: "姓氏和性别为必填项" });
    }

    // 构造提示词并调用AI接口
    const { generateContent } = require("../services/ai");

    // 查询用户历史起名记录
    const [historyNames] = await req.db.execute(
      "SELECT api_response FROM name_records WHERE user_id = ? AND surname = ? AND gender = ? ORDER BY created_at DESC LIMIT 10",
      [req.userInfo.id, surname, gender]
    );

    // 提取历史名字
    const usedNames = historyNames
      .map(record => {
        try {
          const nameData = JSON.parse(record.api_response.data);
          return nameData.name || null;
        } catch (e) {
          console.error('解析历史记录时出错：', e);
          return null;
        }
      })
      .filter(name => name !== null);

    let prompt = `请为一个${gender}孩起一个中文名字，姓氏是${surname}。`;
    
    // 如果有历史名字，添加到提示词中
    if (usedNames.length > 0) {
      prompt += `\n请注意：之前已经使用过以下名字，请避免重复：${usedNames.join('、')}。`;
    }

    // 添加可选参数到提示词
    if (generation_word) {
      prompt += `\n要求使用字辈：${generation_word}`;
    }
    if (five_elements) {
      prompt += `\n五行属性要求，提供出生日期：${five_elements}，自行查询`;
    }
    if (meaning_tags) {
      prompt += `\n期望寓意：${meaning_tags}`;
    }
    if (poetry_source) {
      prompt += `\n需要从${poetry_source}中选取用字。`;
    }

    prompt += `请按照以下JSON格式返回结果：{"name": "完整名字","meaning": "名字的含义解释（详细）","source": "诗词出处详细解释（如果有）","five_elements": "五行属性详细解释（如果有）","pinyin":"名字拼音"}仅返回JSON字符串，不要包含其他说明文字。名字不要太俗气。`;

    // 调用AI接口
    const apiResponse = await generateContent({
      prompt,
      options: {
        // 控制输出的随机性，值越高输出越随机多样，值越低输出越确定
        temperature: 0.9,
        // 生成文本的最大长度
        max_tokens: 1000,
        // 控制生成文本重复同一主题的可能性，值越高越不倾向于重复相同主题
        presence_penalty: 0.6,
        // 控制词语重复的可能性，值越高越不倾向于重复使用相同词语
        frequency_penalty: 0.8
      },
    });

    // 记录查询记录
    // 将本次查询的所有参数和API返回结果保存到数据库
    await req.db.execute(
      "INSERT INTO name_records (user_id, surname, gender, generation_word, five_elements, meaning_tags, poetry_source, query_params, api_response) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
      [
        req.userInfo.id,
        surname,
        gender,
        generation_word || null,
        five_elements || null,
        meaning_tags || null,
        poetry_source || null,
        JSON.stringify(req.body),
        JSON.stringify(apiResponse),
      ]
    );

    // 更新剩余查询次数
    // 减少用户的剩余查询次数，增加总查询次数
    await req.db.execute(
      "UPDATE user_info SET remaining_queries = remaining_queries - 1, total_queries = total_queries + 1 WHERE id = ?",
      [req.userInfo.id]
    );

    res.json(apiResponse);
  } catch (error) {
    console.error("起名错误：", error);
    res.status(500).json({ error: "服务器内部错误" });
  }
});

module.exports = router;
